package com.crm.service.cluePoolManager;

import com.alibaba.fastjson.JSONObject;
import com.crm.model.entity.cluePoolManager.Clue;
import com.crm.model.entity.cluePoolManager.CluePoolPrivate;
import com.crm.model.entity.cluePoolManager.CluePoolRule;
import com.crm.model.entity.sys.UserAccount;
import com.crm.model.qo.cluePoolManager.ClueExtentQO;
import com.crm.model.qo.cluePoolManager.ClueQO;
import com.crm.model.qo.cluePoolManager.ClueSeniorQO;
import com.crm.model.vo.cluePoolManager.ClueVO;
import com.crm.model.vo.cluePoolManager.UserCompanyVO;
import org.apache.ibatis.annotations.Param;

import java.text.ParseException;
import java.util.List;
import java.util.Map;

/**
 * @Author yincuimei
 * @Date 2020/12/24 11:12
 */
public interface ClueDbService {

    /**
     * 私有池、分公司公有池、全国公有池的线索清单
     *
     * @param clueQO       ---普通搜索条件
     * @param clueSeniorQO ---高级搜索条件(包括行业、成立年限、注册资本、企业类型、参保人数、有无联系电话、有无联系人、有无联系邮箱)
     * @return
     */
    List<ClueVO> selectPublicPoolClueList(ClueQO clueQO, ClueSeniorQO clueSeniorQO, String orderStr);

    /**
     * 个人池线索的线索清单(包括个人默认池、个人创建的线索池)
     *
     * @param clueQO       ---普通搜索条件
     * @param clueSeniorQO ---高级搜索条件(包括行业、成立年限、注册资本、企业类型、参保人数、有无联系电话、有无联系人、有无联系邮箱)
     * @return
     */
    List<ClueVO> selectPrivatePoolClueList(ClueQO clueQO, ClueSeniorQO clueSeniorQO, String orderStr);

    /**
     * 根据线索池ID查询该线索池里线索的已分配和已领取总数
     *
     * @param cluePoolPublicId ---线索池ID
     * @return
     */
    long selectDistributedOrReceiveCount(String cluePoolPublicId);

    /**
     * 根据线索池ID查询未删除的线索
     *
     * @param cluePoolPublicId --- 线索池公有id
     * @return
     */
    List<Clue> selectClueList(String cluePoolPublicId);

    /**
     * 线索--分配
     *
     * @param clue
     * @return
     */
    int updateClueDistribute(Clue clue);

    /**
     * 根据个人线索池Id查询所分配的线索条数
     *
     * @param cluePoolPrivateId
     * @return
     */
    long selectCluePrivateCount(String cluePoolPrivateId);

    /**
     * 线索--收回
     *
     * @param clueQO
     * @return
     */
    int updateClueState(ClueQO clueQO);

    /**
     * 线索--删除
     *
     * @param clueQO
     * @return
     */
    int updateDeleteStatusById(ClueQO clueQO);

    /**
     * 管理系统--批量删除线索(将delete_status置为1)
     *
     * @param clueIds
     * @param clueQO
     * @return
     */
    Boolean batchDeleteClueByClueIds(List clueIds, ClueQO clueQO);

    /**
     * 根据线索池ID查询公司
     *
     * @param cluePollId ---线索池ID
     * @return
     */
    List<UserCompanyVO> selectDistributeCompany(String cluePollId);

    /**
     * 根据用户名查询用户信息及所在公司信息(全国公有池、分公司公有池-分配-按人员姓名模糊查找)
     *
     * @param userName ---用户名
     * @return
     */
    List<UserCompanyVO> selectUserAndCompany(String userName);

    /**
     * 查询分公司公有池的用户
     *
     * @param companyIds ---公司ID集合
     * @return
     */
    List<UserCompanyVO> selectUserByPoolPermission(List<String> companyIds, String userName);

    /**
     * 新增线索
     *
     * @param clue
     * @return
     */
    Boolean insertClue(Clue clue);

    /**
     * 查询公共线索池线索数
     *
     * @param cluePoolPublicId
     * @return
     */
    long selectCluePublicCount(String cluePoolPublicId);

    /**
     * 查询线索是否重复(联系人电话和统一社会信用代码是否同时唯一)
     */
    Boolean selectClueIfRepeated(String companyName, String unifiedSocialCreditCode);

    /**
     * 修改线索
     *
     * @param clue
     * @return
     */
    Boolean updateClue(Clue clue);

    /**
     * 查询线索是否重复(公司名称和统一社会信用代码是否同时唯一)
     */
    Boolean selectIsClueRepeated(String companyName, String unifiedSocialCreditCode, String clueId);

    /**
     * 线索池详情-线索清单-查看
     * 根据线索ID查询线索信息
     *
     * @param clueId
     * @return
     */
    Clue selectClueByClueId(String clueId);

    /**
     * @author wll
     * info 线索池公海-线索清单
     */
    List<ClueVO> selectClueInfo(ClueQO clueQO, String orderStr,String source);

    /**
     * info 用户模块-我的线索池-线索清单
     *
     * @return
     */
    List<ClueVO> getMyClueList(ClueQO clueQO, ClueExtentQO clueExtentQO, String orderStr, String dictionaryEnum);

    /**
     * info 用户模块-我的线索池-线索清单-释放线索
     */
    Boolean modifyClueData(Map map);

    /**
     * @author wll
     * info 查询当前线索状态是否在池(公海里的线索同一时间可以很多人操作同一条线索) 删除状态是否正常
     * return true该条线索未被领取 false该条线索已被领取
     */
    JSONObject checkClueIsInThePool(ClueQO clueQO);

    /**
     * 查询用户模块-我的线索池-线索清单-线索池线索数
     *
     * @param cluePoolPrivateId
     * @return
     */
    long selectCluePoolPrivateCount(String cluePoolPrivateId);


    /**
     * @author wll
     * info 线索领取到个人默认池 同时添加领取记录
     */
    JSONObject getClueToThePersonalDefaultPool(CluePoolPrivate cluePoolPrivate, ClueQO clueQO, String poolId);

    /**
     * 线索0次领取数量
     *
     * @param cluePoolId
     * @return
     */
    long clueZeroTimeReceiveCount(String cluePoolId);

    /**
     * 线索总转化数
     *
     * @param cluePoolPublicId 线索池公有id
     * @return
     */
    long selectClueConverCountByPublicPoolId(String cluePoolPublicId);


    /**
     * 获取一个线索
     * @return
     */
    Clue selectOneClue();

    /***
     * @Description:按每月查询线索转化统计
     * @Param: cluePoolId 线索池id
     * @Param: yearMonth 年月
     * @Author: luojie
     * @Date: 2021/5/13 15:07
     */
    long getCluePoolConversionStatisticsForOneMonth(String cluePoolId, String yearMonth) throws ParseException;

    int batchInsertClue(List<Clue> clueList);

    /**
     * @description 根据线索ID修改线索标签
     * @param tag 标签
     * @param clueId 线索ID
     * @author ChengYun
     * @date 2021年12月14日 下午 14:34:59
     */
    int updateUserClueTag(String tag, String clueId);
}
